{{tag>serveur tutoriel}}

----


====== Serveur LAMP - Créer un/des répertoires de travail ======


===== Présentation =====

L'erreur de beaucoup de personnes arrivant sur Ubuntu et/ou GNU/Linux est de créer des pages internet avec des droits d'administration ou d'affecter le répertoire /var/www à un utilisateur. En contrepartie, beaucoup d'utilisateurs trouvent également peu pratique de devoir travailler dans un répertoire qu'ils n'ont pas choisi.\\
**/var/www** est un répertoire sous droits root. Il est donc contre indiqué de travailler dans ce répertoire.
<note important>le fichier index.html "It works!" installé par défaut (apache2 version 2.4.7) stipule: "Le répertoire root par défaut sous Ubuntu est /var/www/html. Vous pouvez définir votre propre "virtual hosts" dans /var/www. C'est différent des précédentes versions qui préconisaient de se placer en dehors de ce répertoire pour des raisons de sécurité." </note>
Ici nous allons exposer comment créer ses propres répertoires de travail avec des droits spécifiques à une utilisation à la fois '**publique**' (serveur web personnel) et '**privée**' (serveur de développement).

Nous allons aussi faire en sorte de rendre **/var/www** inaccessible de l'extérieur ou du moins accessible de façon ponctuelle.

===== Mise en place =====

 Attention ! Pour la version Ubuntu 14.04, apache2 est en version 2.4.7. Le nouveau répertoire racine pour le serveur est: **/var/www/html** et non ///var/www//. Voir la remarque en fin du **4. Problèmes**.
==== Protection de /var/www ====

Dans un premier temps nous allons donc rendre le dossier /var/www inaccessible. Pour cela, on [[tutoriel:comment_editer_un_fichier|édite]] en [[:sudo|super utilisateur]] le fichier : **/etc/apache2/sites-available/default** (ou à partir de Ubuntu 14.04, le fichier :  **/etc/apache2/sites-available/000-default.conf**) et dans la section <Directory /var/www> on va modifier les accès . //Depuis la version 2.4 d'apache le fichier 000-default.conf n'a plus de section <Directory /var/www>, il faut la rajouter en dessous de la ligne  DocumentRoot /var/www//. \\
Changez :\\
<file>
<Directory /var/www/>
	Options Indexes FollowSymLinks MultiViews
	AllowOverride None
	Order allow,deny
	Allow from all
</Directory>
</file>
en :\\
A partir de ubuntu 13.10 et apache 2.4 
<file>
<Directory /var/www/>
	Options Indexes FollowSymLinks MultiViews
	AllowOverride None
	<RequireAny>
		Require ip 127.0.0.1
		Require ip 192.168.1.0
	</RequireAny>
</Directory>
</file>

Pour les versions précédentes à ubuntu 13.10 et apache 2.4

<file>
<Directory /var/www/>
	Options Indexes FollowSymLinks MultiViews
	AllowOverride None
	Order Deny,Allow
	Deny from all
	Allow from 127.0.0.1		# local
	Allow from 192.168.1.0/24	# reseau
</Directory>
</file>

Cette modification va faire en sorte que seule votre machine (127.0.0.1) et celles de votre réseau local (à condition que celui-ci utilise l'adresse 192.168.1.0) auront accès aux pages web situées dans le dossier **/var/www/**.


==== Création des répertoires de travail ====

Ici nous allons placer nos répertoires dans la zone **/media** (en prévision d'une installation sur une clé usb, un disque externe, une partition séparée, etc. Libre à vous de choisir le lieu ... qu'il reste cohérent quand même :-P\\

  sudo mkdir /media/www-dev
  sudo mkdir /media/www-dev/public
  sudo mkdir /media/www-dev/private


==== Donner les droits utilisateur aux répertoires de travail ====

<note important>__Attention__ : la variable '**$USER**' est une variable pour l'utilisateur en cours. si vous voulez affecter ces répertoires à un autre utilisateur, donnez le nom réel de l'utilisateur.\\
Le '**users**' par contre est un nom de **group** (normalement déjà présent sur votre installation). Soit vous utilisez nom_user:nom_user, soit nom_user:users.\\
'**users**' étant souvent le **group** utilisé sur de l'hébergement mutualisé, ce qui vous permet de simuler votre hébergeur au plus près.</note>

  sudo chown -R $USER:users /media/www-dev



<note important>Si vous n'utilisez pas /media/www/ mais un dossier personnalisé, attention :
  * Vous ne pouvez pas utiliser des partitions NTFS et FAT, car elles ne gèrent pas les droits utilisateurs. il faut donc impérativement que votre dossier figure sur une partition Linux.
  * Si votre dossier figure sur un autre disque dur (clef USB, etc...), toutes les permissions doivent être favorables, sur chacun des dossiers, depuis le disque lui même.
Exemple : votre site se situe sous /media/votre_disque/vos_sites/votre_site, il vous faut exécuter :

sudo chown $USER:users /media/votre_disque

sudo chown $USER:users /media/votre_disque/vos_sites

sudo chown -R $USER:users  /media/votre_disque/vos_sites/votre_site
</note>
==== Configuration d'alias dans apache ====

Pour pouvoir accéder à ces répertoires, apache a besoin d'une *//redirection//*.\\
Cette *//redirection//* se présente sous la forme : http://nom_de_domaine.tld/nom_de_redirection\\
Ces *//redirections//* s'appellent des **Alias**.\\
Il nous faut donc ajouter deux alias, un  pour **public** et un pour **private**.

[[tutoriel:comment_editer_un_fichier|Éditez]] en [[:sudo|super utilisateur]] le fichier : **/etc/apache2/sites-available/default** (ou **/etc/apache2/sites-available/000-default.conf** pour Ubuntu 14.04 et plus) et ajoutez à la suite de <Directory /var/www>....</Directory> :\\

<note tip>Dans le cas ci-dessous on accorde un accès au W3C (validateur html) et à l'espace dédié aux développeurs d'application utilisant Paypal</note>

A partir de ubuntu 13.10 et apache 2.4 
<file>
## ZONE PUBLIQUE
Alias /public /media/www-dev/public
<Directory /media/www-dev/public>
	Options Indexes FollowSymLinks MultiViews
	AllowOverride All
	Require all granted
</Directory>

## ZONE PRIVEE
Alias /private /media/www-dev/private
<Directory /media/www-dev/private>
	Options Indexes FollowSymLinks MultiViews
	AllowOverride All
	<RequireAny>
		Require ip 127.0.0.1
		Require ip 192.168.1
		Require host .w3.org
		Require host sandbox.paypal.com
	</RequireAny>
</Directory>
</file>

Pour les versions précédentes à ubuntu 13.10 et apache 2.4
<file>
## ZONE PUBLIQUE
Alias /public /media/www-dev/public
<Directory /media/www-dev/public>
	Options Indexes FollowSymLinks MultiViews
	AllowOverride All
	Order allow,deny
	Allow from all
</Directory>

## ZONE PRIVEE
Alias /private /media/www-dev/private
<Directory /media/www-dev/private>
	Options Indexes FollowSymLinks MultiViews
	AllowOverride All
	Order deny,allow
	Deny from all
	Allow from 127.0.0.1            # Local
	Allow from 192.168.1.0/24       # Réseau
	Allow from .w3.org              # W3C
	Allow from sandbox.paypal.com   # Paypal
</Directory>
</file>

==== Ajout de liens symboliques ====

A présent les espaces sont valides, mais non visibles depuis la racine de votre serveur (c.f.: http://localhost). Il serait donc judicieux et pratique d'y avoir accès directement, plutôt que de devoir taper manuellement 'http://localhost/public' ou 'http://localhost/private'.\\
Il suffit tout simplement de créer un lien symbolique dans **/var/www**

<note important>__Attention:__ Ne jamais faire un '//rm -rf//' sur un lien symbolique ... cette commande aura pour effet de supprimer le contenu réel de destination du lien symbolique. Utilisez juste '//rm /dossier/nom_symbolique//' comme s'il s'agissait d'un simple fichier.\\
les liens symboliques dans **/var/www** se font via 'sudo' et donc sont en //root:root//. **Ne changez pas ces droits !**</note>

  sudo ln -s /media/www-dev/public /var/www/html/public
  sudo ln -s /media/www-dev/private /var/www/html/private

Il vous faudra également effacer le fichier index.html pour que cela prenne effet :

  sudo rm /var/www/html/index.html

==== Éviter le 403 ====

Les répertoires **/var/www** et **/media/www-dev/private** (/var/www/private) étant interdit de l'extérieur, un visiteur tapant votre adresse (ip / [[:dns_dynamique|no-ip , DynDNS]] / nom de domaine) directement sans préciser le dossier '//public//', se verra accueilli par une belle page en 403 (ou s'il tente d'accéder *par miracle* <-- faut le savoir :-P à votre répertoire '//private//')

Si vous n'avez pas de domaine (domain.tld est un exemple générique), il faudra utiliser votre IP réelle (ex : http://checkip.dyndns.org/ ).

On va donc remédier à cela en redirigeant les visiteurs automatiquement vers le répertoire '//public//' en cas d'erreur 403.\\
Il suffit d'ajouter la ligne :
  ErrorDocument 403 "http://domain.tld/public"
à la suite de :
  <Directory /var/www>
et :
  <Directory /media/www-dev/private>

Dans certains cas une erreur 403 peut également se produire lorsque vous demandez l'affichage de localhost alors que 127.0.0.1 fonctionne (et que vous avez d'ores et déjà réglé les problèmes de ServerName dans /etc/hosts et  /etc/apache2/apache2.conf). 

Avant Ubuntu 14.04, dans le fichier : /etc/apache2/sites-available/default, ajouter à la suite de <Directory /var/www>  la ligne :
  Allow from localhost            # Local
après 
  Allow from 127.0.0.1            # Local
A partir de Ubuntu 14.04, il faut ajouter
  Require host localhost 
après 
  <RequireAny>
      Require ip 127.0.0.1 
===== Finalisation =====

Voilà c'est fini. À présent il vous suffit de recharger la configuration d'apache pour rendre tout cela opérationnel.
  sudo service apache2 force-reload

===== Problèmes =====

* Cas d'une erreur sur ServerName au rechargement d'apache\\
 [[:apache2|Erreur ServerName]]

* Renvoi vers votre 'livebox/neufbox/ClubInternet Box' avec un nom de domaine.\\
 [[tutoriel:comment_editer_un_fichier|Éditez]] en [[:sudo|super utilisateur]] le fichier : **/etc/hosts** et ajouter une ligne avec :
  127.0.0.1 domain.dnsalias.net

* Erreur sur le localhost \\
 [[tutoriel:comment_editer_un_fichier|Éditez]] en [[:sudo|super utilisateur]] le fichier : **/etc/hosts** et remplacer les lignes :
  127.0.0.1 localhost
  127.0.1.1 <hostname>
par :
  127.0.0.1 localhost <hostname>
  
* Apache2 + Ubuntu 14.04 (et systèmes suivants) nouveau répertoire racine:
 
Attention pour la nouvelle version 14.04, la version apache2 qui a été publié lors de la Ubuntu 14.04 est en 2.4.7 il semble que, pour des raisons de sécurité, le nouveau répertoire racine pour le serveur est:
**/var/www/html**

Donc, à partir de maintenant, vous devez placer les fichiers de votre site Web dans le dossier **/var/www/html**. Et comme cela, vous ne devriez pas avoir à nouveau ce problème avec les mises à jour futures.

Quoi qu'il en soit, si vous voulez changer ce répertoire racine pour un autre, vous devez modifier (en tant que root) le fichier **000-default.conf** situé dans **/etc/apache2/sites-available**
<code>sudo nano /etc/apache2/sites-available/000-default.conf</code>
C'est la ligne suivante: //DocumentRoot /var/www/html//\\ 
qu'il faut modifier à: //DocumentRoot /var/www/chemin-vers-son-autre-répertoire//

----
 --- //[[|]] Contributeur/Mainteneur : [[utilisateurs:McPeter]]//